#include "mainwindowimpl.h"
#include "structures.h"
#include "Bienvenue.h"
#include "compress.h"
#include "McCreight.h"
#include "ConstrArbre2.h"
#include "DestrAbre2.h"
#include <iostream>
#include <string>
#include <sstream>

using namespace std;


MainWindowImpl::MainWindowImpl( QWidget * parent, Qt::WFlags f) 
	: QMainWindow(parent, f)
{
	setupUi(this);
	
}
void MainWindowImpl::action_ecrired()
{
		bool ok = false;dico2* racine=NULL;
    QString chaine = QInputDialog::getText(this, "Fichier", "Veuillez ecrire la chaine en utilisant exclusivement les lettres a, t , c et g et en terminant par un $", QLineEdit::Normal, QString(), &ok);
	 if (ok && !chaine.isEmpty())
    {
       if(bien((char*)chaine.toStdString().c_str()))
       	{
       
		int reponse = QMessageBox::question(this, "Encodage", "Voulez-vous utiliser l'algotithme Naif (l'encodage sera plus lent) ?", QMessageBox::Yes | QMessageBox::No);
		 float a;stringstream *out = new stringstream;
		if (reponse == QMessageBox::Yes)
    	{
    	   
    	    racine = ConstrArbre2((char*)chaine.toStdString().c_str(),progressBar,&a);
    	}
    	else if (reponse == QMessageBox::No)
    	{
    	    racine = MacCreight((char*)chaine.toStdString().c_str(),progressBar,&a);
    	}

		
		*out << a;
    	QString val=  	QString(out->str().c_str());
    	delete out;
    	out = new stringstream;
    	*out << strlen((char*)chaine.toStdString().c_str());
    	QString taille = QString(out->str().c_str());
		if(racine!=NULL)
		{	char* chaine2 = new char[strlen((char*)chaine.toStdString().c_str())+1];string a;
			a =chaine.toStdString();
			unsigned int i=0;
			while(a[i-1]!='$')
			{
					chaine2[i] =a[i];
					chaine2[i+1]='\0';
					i++;
			}
				progressBar->setValue(100);
			QMessageBox::critical(this, "Fini !", "Chaine encode en "+val+" secondes pour "+taille+" caracteres! ");	
			
			
			
			ap = new ResearchWindow();
			ap->setChaine(chaine2);
			ap->setqgenome(chaine);
			ap->setArbre(racine);
			ap->titre();
			ap->show();
			//supprimerArbre2(racine);
			//this->close();
			progressBar->setValue(0);
		}
		}
		else
			QMessageBox::critical(this, "Erreur", "Vous avez fait une erreur lors de l'ecriture de la chaine : "+chaine);
		   
    }
	
}
void MainWindowImpl::ouvrir_fichier()
{
	char* genome;dico2* racine=NULL;
	QString fichier = QFileDialog::getOpenFileName(this, "Ouvrir un fichier", QString(), "Texte (*.txt)");
	 if(fichier!="")
	{
		genome = RecupChaine((char*)fichier.toStdString().c_str());
		
		int reponse = QMessageBox::question(this, "Encodage", "Voulez-vous utiliser l'algotithme Naif (l'encodage sera plus lent) ?", QMessageBox::Yes | QMessageBox::No);
		float a;stringstream *out = new stringstream;
		if (reponse == QMessageBox::Yes)
    	{
    		
    	    racine = ConstrArbre2(genome,progressBar,&a);
    	}
    	else if (reponse == QMessageBox::No)
    	{
    	    racine = MacCreight(genome,progressBar,&a);
    	}
		*out << a;
    	QString val=  	QString(out->str().c_str());
    	delete out;
    	out = new stringstream;
    	*out << strlen(genome);
    	QString taille = QString(out->str().c_str());
		if(racine!=NULL)
		{	
			progressBar->setValue(100);
			QMessageBox::critical(this, "Fini !", "Chaine encode en "+val+" secondes pour "+taille+" caracteres! ");
			ap = new ResearchWindow();
			ap->setChaine(genome);
			ap->setArbre(racine);
			ap->setqgenome(QString(genome));
			ap->titre();
			ap->show();
			progressBar->setValue(0);
		
			//this->close();
		}
	}
}
void MainWindowImpl::ouvrir_fichier_decompress()
{
	char* genome=NULL;FILE* fichier2 = NULL;dico2* racine=NULL;
	QString fichier = QFileDialog::getOpenFileName(this, "Ouvrir un fichier et le decompresser", QString(), "DicoSu (*.dicosu)");
	 if(fichier!="")
	{
		fichier2 = fopen((char*)fichier.toStdString().c_str(), "r");
 
    	if (fichier2 != NULL)
    	{
			genome = decompress(fichier2);
		}
		int reponse = QMessageBox::question(this, "Encodage", "Voulez-vous utiliser l'algotithme Naif (l'encodage sera plus lent) ?", QMessageBox::Yes | QMessageBox::No);
		float a;
		stringstream *out = new stringstream;
		if (reponse == QMessageBox::Yes)
    	{
    	    
    	    racine = ConstrArbre2(genome,progressBar,&a);
    	}
    	else if (reponse == QMessageBox::No)
    	{
    	    racine = MacCreight(genome,progressBar,&a);
    	}
    	*out << a;
    	QString val=  	QString(out->str().c_str());
    	delete out;
    	out = new stringstream;
    	*out << strlen(genome);
    	QString taille = QString(out->str().c_str());
		if(racine!=NULL)
		{	
			progressBar->setValue(100);
			QMessageBox::critical(this, "Fini !", "Chaine encode en "+val+" secondes pour "+taille+" caracteres! ");
			ap = new ResearchWindow();
			ap->setChaine(genome);
			ap->setArbre(racine);
			ap->setqgenome(QString(genome));
			ap->titre();
			ap->show();
			progressBar->setValue(0);
			
			//this->close();
		}
		
		
	}
}
//
bool bien(char* chaine)
{
	for(unsigned int i = 0 ; i < strlen(chaine) ; i++ )
	{
		if(chaine[i]!='a' && chaine[i]!='t'	&& chaine[i]!='c' && chaine[i]!='g' && chaine[i]!='$')
			{
				return false;
				}
				else if (chaine[i]=='$' && i < strlen(chaine)-1)
				{
					return false;
				}
	}
	if(chaine[strlen(chaine)-1]!='$')
		return false;
	return true;
	
}
